import axios from 'axios';
import {getToken} from "../utils/auth"; // 用于获取当前的 token 权限
import {ElLoading} from 'element-plus'; // Element UI 的加载指示器服务

const axiosPlugin = {
    install(app) {
        // 设置 Axios 请求拦截器
        axios.interceptors.request.use(
            function (config) {
                // 检查并在非登录请求中添加 token 到请求头
                if (config.url !== "/signIn") {
                    let _token = getToken();
                    config.headers["Authorization"] = _token; // 添加 token
                }
                return config;
            },
            function (error) {
                // 请求错误时的处理
                return Promise.reject(error);
            }
        );

        // 设置 Axios 的基础 URL
        axios.defaults.baseURL = "/api";

        async function asyncPost(url, params, loading) {
            // 显示加载指示器
            let loadingInstance;
            if (loading == false) {
                try {
                    const response = await axios.post(url, params);
                    const data = response.data;
                    // 返回数据或错误信息
                    return data ? data : {success: false, message: '未返回结果'};
                } catch (e) {
                    return {success: false, message: e};
                }
            } else {
                loadingInstance = ElLoading.service({
                    lock: true,
                    text: 'Loading',
                    background: 'rgba(0, 0, 0, 0.7)',
                });
                try {
                    const response = await axios.post(url, params);
                    loadingInstance.close(); // 关闭加载指示器
                    const data = response.data;
                    // 返回数据或错误信息
                    return data ? data : {success: false, message: '未返回结果'};
                } catch (e) {
                    loadingInstance.close(); // 关闭加载指示器
                    return {success: false, message: e};
                }
            }
        };

        async function post(url, params, cb) {
            // 显示加载指示器
            let loadingInstance = ElLoading.service({
                lock: true,
                text: 'Loading',
                background: 'rgba(0, 0, 0, 0.7)',
            });

            // 发送 post 请求
            axios.post(url, params)
                .then(response => {
                    loadingInstance.close(); // 关闭加载指示器
                    let data = response.data;
                    // 如果数据存在，调用回调函数
                    if (data) {
                        cb.call(null, data);
                    } else {
                        alert("未知错误");
                    }
                })
                .catch(error => {
                    loadingInstance.close(); // 关闭加载指示器
                    console.log(error); // 错误处理
                });
        };

        async function exportExcel(params) {
            // 显示加载指示器
            let loadingInstance = ElLoading.service({
                lock: true,
                text: 'Loading',
                background: 'rgba(0, 0, 0, 0.7)',
            });
            try {
                // 定义要传递给后端的参数

                const response = await axios.post('exportExcel', params, {
                    responseType: 'blob', // 指定响应类型为 Blob
                    headers: {
                        'Content-Type': 'application/json',
                    },
                });
                loadingInstance.close(); // 关闭加载指示器

                // 创建一个下载链接
                const url = window.URL.createObjectURL(new Blob([response.data]));
                const link = document.createElement('a');
                link.href = url;
                link.setAttribute('download', params.fileName); // 设定下载文件名
                document.body.appendChild(link);
                link.click();
                window.URL.revokeObjectURL(url); // 释放URL对象
                document.body.removeChild(link); // 移除链接
            } catch (error) {
                loadingInstance.close(); // 关闭加载指示器
                console.error('导出失败', error);
            }

        };

        // 在 Vue 实例上添加一个 $post 方法，用于发送 post 请求
        app.config.globalProperties.$post = post;

        // 添加一个 $asyncPost 方法，用于异步发送 post 请求
        app.config.globalProperties.$asyncPost = asyncPost;
        app.config.globalProperties.$exportExcel = exportExcel;

        // 使用 provide 提供方法以便在组合式的vue script中使用
        app.provide('asyncPost', asyncPost);
        app.provide('exportExcel', exportExcel);
    }

};

export default axiosPlugin;
